package grupobbva.pe.operhc.service;

import static grupobbva.pe.operhc.util.Constant.*;
import grupobbva.pe.operhc.domain.Cliente;
import grupobbva.pe.operhc.domain.Contratacion;
import grupobbva.pe.operhc.domain.Contrato;
import grupobbva.pe.operhc.domain.PerfilIDM;
import grupobbva.pe.operhc.domain.Producto;
import grupobbva.pe.operhc.util.GenericObject;
import grupobbva.pe.operhc.util.InvokeWS;
import grupobbva.pe.operhc.util.ReadProperties;
import grupobbva.pe.operhc.util.Utilities;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.ArrayConverter;
import org.apache.commons.beanutils.converters.ClassConverter;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import pe.com.grupobbva.ohc.hy10.CtConOhcHY10Rs;
import pe.com.grupobbva.ohc.hy20.CtConOhcHY20Rs;
import pe.com.grupobbva.ohc.hy30.CtConOhcHY30Rs;
import pe.com.grupobbva.ohc.hy40.CtConOhcHY40Rs;

public class CuadroMandoServiceImpl implements CuadroMandoService {
	private static Logger logger = Logger.getLogger(CuadroMandoServiceImpl.class);
	ReadProperties readProperties = new ReadProperties();

	public CuadroMandoServiceImpl() {
	}
	
	public Map<String, Object> consultarCliente(String codigoUsuario, String tipoDocumento, String numeroDocumento, String codigoCentral) throws Exception {
		Map<String, Object> respuesta = new HashMap<String, Object>();
		
		//COMENTAR MITLON DESCOMENTAR EN PROD
		//CtConOhcHY10Rs response = InvokeWS.consumirHY10(codigoUsuario, tipoDocumento, numeroDocumento, codigoCentral);
		CtConOhcHY10Rs response = (CtConOhcHY10Rs) Utilities.deserializaObjeto("D:\\operhc\\ServicioHY10_"+tipoDocumento+"-"+numeroDocumento+".ser");
		
		if(response!=null) {
			if(logger.isDebugEnabled()) logger.debug(response.getData());
			String codigoRespuesta = response.getHeader().getCodigo();
			if(RESPUESTA_EXITOSA.equals(codigoRespuesta)) {
				Cliente cliente = new Cliente();
				ConvertUtils.register(new ArrayConverter(Producto[].class, new ClassConverter(null)), List.class);
				ConvertUtils.register(new ArrayConverter(Contrato[].class, new ClassConverter(null)), List.class);
				BeanUtils.copyProperties(cliente, response.getData());
				cliente.mapearNumericos();
				cliente.mapearProductos();
				respuesta.put("cliente", cliente);
			} else {
				if(response.getHeader().getCodigo().equalsIgnoreCase(FALLO_COMUNICACION)) {
					respuesta.put(MESSAGES_ERR_KEY, readProperties.getProperty("etiqueta.error.host.timeout") + ": " + response.getHeader().getDescripcion());
				} else {
					respuesta.put(MESSAGES_ERR_KEY, StringUtils.substring(response.getHeader().getDescripcion(), 8));
				}
			}
		} else {
			respuesta.put(MESSAGES_ERR_KEY, readProperties.getProperty("etiqueta.error.ws.nofound"));
		}
		return respuesta;
	}
	
	public Cliente buscarCliente(String codigoUsuario, String tipoDocumento, String numeroDocumento, String codigoCentral) throws Exception {
		CtConOhcHY10Rs response = InvokeWS.consumirHY10(codigoUsuario, tipoDocumento, numeroDocumento, codigoCentral);
		Cliente cliente = new Cliente();
		ConvertUtils.register(new ArrayConverter(Producto[].class, new ClassConverter(null)), List.class);
		ConvertUtils.register(new ArrayConverter(Contrato[].class, new ClassConverter(null)), List.class);
		BeanUtils.copyProperties(cliente, response.getData());
		cliente.mapearNumericos();
		cliente.mapearProductos();
		return cliente;
	}
	
	/*TODO: RDELOSREYES 2013-04-04 Antigua manera de obtener los contratos
	public List<Contrato> buscarContratos(String codigoUsuario, String tipoDocumento, String numeroDocumento) throws Exception {
		CtConOhcHY30Rs response = InvokeWS.consumirHY30(codigoUsuario, FN_DEFAULT, tipoDocumento, numeroDocumento, "");
		List<Contrato> listContratos = new ArrayList<Contrato>();
		if(response != null) {
			String[] listadoContratos = response.getData().getDetalles(); 
			for (String contratoInfo : listadoContratos) {
				if(StringUtils.isNotBlank(contratoInfo)) {
					Contrato contrato = new Contrato();
					listContratos.add(contrato.mapearContrato(contratoInfo));
				}
			}
		}
		return listContratos;
	}
	*/
	
	public List<Contrato> buscarTodosContratos(String codigoUsuario, String tipoDocumento, String numeroDocumento) {
		String teclaPulsada = FN_DEFAULT;
		String control = "";
		List<Contrato> listContratos = new ArrayList<Contrato>();
		String[] listadoContratos = new String[13];
		//MILTON DESCOMENTAR EN PRODU
		
//		do {
//			if(StringUtils.isNotBlank(control)) {
//				teclaPulsada = FN_PAGINA_SGTE;
//			}
//			CtConOhcHY30Rs response = InvokeWS.consumirHY30(codigoUsuario, teclaPulsada, tipoDocumento, numeroDocumento, control);
//			if(response != null) {
//				control = response.getData().getControl();
//				listadoContratos = response.getData().getDetalles();
//				for (String contratoInfo : listadoContratos) {
//					if(StringUtils.isNotBlank(contratoInfo)) {
//						Contrato contrato = new Contrato();
//						listContratos.add(contrato.mapearContrato(contratoInfo));
//					}
//				}
//			}
//		} while(StringUtils.isNotBlank(control) && StringUtils.isNotBlank(listadoContratos[0]));
		//COMENTAR MILTON PARA OBTENER EL SERIALIZADO DESCOMENTAR EN PROD
		
		try {
			listadoContratos = (String[]) Utilities.deserializaObjeto("D:\\operhc\\ServicioHY30_"+tipoDocumento+"-"+numeroDocumento+".ser");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		return listContratos;
	}
	
	public List<Contrato> filtrarContratosVisibles(List<Contrato> listContratos, Cliente clienteSession) {
		List<Contrato> listContratosVisibles = new ArrayList<Contrato>();
		for (Contrato contrato : listContratos) {
			if(contrato.estaRechazado()) {
				continue;
			} else {
				if(contrato.esFormalizado() && !contrato.estaVigente(clienteSession.getFechaEvaluacion())) {
					continue;
				}
			}
			listContratosVisibles.add(contrato);
		}
		return listContratosVisibles;
	}
	
	/**
	 * Para las no clientes, en caso que realicen contrataciones proactivas y se encuentren vigentes no le mostrara el carrusel  
	 * 
	 */
	public boolean mostrarOfertasNoCliente(List<Contrato> listContratos, Cliente clienteSession) {
		boolean flag = true;
		//No Cliente: No contrata por Hermes
		if (NO.equalsIgnoreCase(clienteSession.getContrataHermes())) {
			for (Contrato contrato : listContratos) {
				if (contrato.estaRechazado()) {
					continue;
				} else {
					if(contrato.estaVigente(clienteSession.getFechaEvaluacion())) {
						flag = false;
						break;
					}
				}
			}
		}
		return flag;
	}
	
	public Map<String, String> crearContrato(String codigoUsuario, Contratacion contratacion) {
		Map<String, String> respuesta = new HashMap<String, String>();
		try {
			CtConOhcHY20Rs response = InvokeWS.consumirHY20(codigoUsuario, FN_ALTA_CONTRATO, contratacion);
			if(response!=null) {
				if(logger.isDebugEnabled()) logger.debug(response.getData());
				String codigoRespuesta = response.getHeader().getCodigo();
				String aviso = response.getHeader().getAviso();
				Map<String, String> respuestaAviso = new HashMap<String, String>();
				if (StringUtils.isNotBlank(aviso)) {
					respuestaAviso = procesarAviso(aviso);
				}
				
				if(RESPUESTA_EXITOSA.equals(codigoRespuesta)) {
					if(ALTA_CONTRATO_OK.equals(respuestaAviso.get("codigoAviso"))) {
						if(FAMILIA_PRESTAMOS.equals(contratacion.getFamilia())) {
							respuesta.put("numeroContrato", response.getData().getPrestamo().getContrato());
						} else if(FAMILIA_TARJETAS.equals(contratacion.getFamilia())) {
							respuesta.put("numeroContrato", response.getData().getTarjeta().getContrato());
						}
					} else {
						respuesta.put(MESSAGES_ERR_KEY, respuestaAviso.get("descripcionAviso"));
					}
				} else {
					if(response.getHeader().getCodigo().equalsIgnoreCase(FALLO_COMUNICACION)) {
						respuesta.put(MESSAGES_ERR_KEY, readProperties.getProperty("etiqueta.error.host.timeout") + ": " + response.getHeader().getDescripcion());
					} else {
						respuesta.put(MESSAGES_ERR_KEY, StringUtils.substring(response.getHeader().getDescripcion(), 8));
					}
				}
			} else {
				respuesta.put(MESSAGES_ERR_KEY, readProperties.getProperty("etiqueta.error.ws.nofound"));
			}
		} catch(Exception e) {
			respuesta.put(MESSAGES_ERR_KEY, e.getMessage());
			logger.error(GenericObject.formatException(e));
		}
		return respuesta;
	}
	
	public Map<String, String> anularContrato(String codigoUsuario, Contratacion contratacion) {
		Map<String, String> respuesta = new HashMap<String, String>();
		try {
			CtConOhcHY20Rs response = InvokeWS.consumirHY20(codigoUsuario, FN_BAJA_CONTRATO, contratacion);
			if(response!=null) {
				if(logger.isDebugEnabled()) logger.debug(response.getData());
				String codigoRespuesta = response.getHeader().getCodigo();
				String aviso = response.getHeader().getAviso();
				Map<String, String> respuestaAviso = new HashMap<String, String>();
				if (StringUtils.isNotBlank(aviso)) {
					respuestaAviso = procesarAviso(aviso);
				}
				if(RESPUESTA_EXITOSA.equals(codigoRespuesta)) {
					if(BAJA_CONTRATO_OK.equals(respuestaAviso.get("codigoAviso"))) {
						respuesta.put("numeroContrato", contratacion.getContrato().getNumeroContrato());
					} else {
						respuesta.put(MESSAGES_ERR_KEY, respuestaAviso.get("descripcionAviso"));
					}
				} else {
					respuesta.put(MESSAGES_ERR_KEY, StringUtils.substring(response.getHeader().getDescripcion(), 8));
				}
			} else {
				respuesta.put(MESSAGES_ERR_KEY, readProperties.getProperty("etiqueta.error.ws.nofound"));
			}
		} catch(Exception e) {
			respuesta.put(MESSAGES_ERR_KEY, e.getMessage());
			logger.error(GenericObject.formatException(e));
		}
		return respuesta;
	}
	
	public Map<String, String> reevaluarNuevaCuota(String codigoUsuario, String tipoDocumento, String numeroDocumento, BigDecimal cuotaReevaluada) {
		Map<String, String> respuesta = new HashMap<String, String>();
		try {
			CtConOhcHY40Rs response = InvokeWS.consumirHY40(codigoUsuario, tipoDocumento, numeroDocumento, cuotaReevaluada);
			if(response!=null){
				String codigoRespuesta = response.getHeader().getCodigo();
				if(RESPUESTA_EXITOSA.equals(codigoRespuesta)) {
					respuesta.put("mensajeExito", "El cliente fue reevaluado satisfactoriamente");
				} else {
					respuesta.put(MESSAGES_ERR_KEY, StringUtils.substring(response.getHeader().getDescripcion(), 8));
				}
			} else {
				respuesta.put(MESSAGES_ERR_KEY, readProperties.getProperty("etiqueta.error.ws.nofound"));
			}
		} catch(Exception e) {
			respuesta.put(MESSAGES_ERR_KEY, e.getMessage());
			logger.error(GenericObject.formatException(e));
		}
		return respuesta;
	}
	
	private Map<String, String> procesarAviso(String aviso) {
		Map<String, String> respuesta = new HashMap<String, String>();
		respuesta.put("codigoAviso", StringUtils.substring(aviso, 0, 7).trim());
		respuesta.put("descripcionAviso", StringUtils.right(aviso, 71).trim());
		return respuesta;
	}
	


}
